package com.lyh;

import org.junit.Test;
import sun.rmi.runtime.Log;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.logging.*;

public class JULTest {

    @Test
    public void testQuick(){
        // 1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.lyh.JULTest");
        // 2. 日志记录的输出
        logger.info("hello jul"); // 信息: hello jul

        // 或者可以使用通用方法进行日志记录
        logger.log(Level.INFO,"info msg"); // 信息: info msg

        // 通过占位符输出变量值
        String name = "jul";
        logger.log(Level.INFO,"hello,{0}",name); // 信息: hello,jul
    }

    @Test
    public void testLogLevel(){
        // 1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.lyh.JULTest");
        // 2. 日志记录输出
        logger.severe("severe");
        logger.warning("warn");
        logger.info("info"); // jul 默认的日志级别是 info，只有 >= info 的才会输出
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    @Test
    public void testLogConfig(){
        // 1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.lyh.JULTest");

        // 关闭系统默认配置
        logger.setUseParentHandlers(false);

        // 创建 ConsoleHandler
        ConsoleHandler ch = new ConsoleHandler();

        // 创建简单格式转换对象
        SimpleFormatter sf = new SimpleFormatter();

        // 进行关联
        ch.setFormatter(sf);
        logger.addHandler(ch);

        // 配置日志记录的具体级别
        ch.setLevel(Level.ALL);
        logger.setLevel(Level.ALL);

        // 2. 日志记录输出
        logger.severe("severe");
        logger.warning("warn");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

    @Test
    public void testLogParent(){
        Logger logger1 = Logger.getLogger("a");
        Logger logger2 = Logger.getLogger("a.b");
        // 所有日志记录器的顶级父元素都是 LogManager$RootLogger name=""
        System.out.println(logger1.getParent().getName()); // ""
        System.out.println(logger2.getParent().getName()); // a
    }

    @Test
    public void testLogProperties() throws IOException {
        // 读取配置文件
        InputStream ins = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
        // 获得 LogManager
        LogManager logManager = LogManager.getLogManager();
        // 通过 LogManager 加载配置文件
        logManager.readConfiguration(ins);

        Logger logger = Logger.getLogger("com.lyh");

        logger.severe("severe");
        logger.warning("warn");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");
    }

}
